<?php

/**
 * ImportAction - Classe du module d'import
 *
 * @package
 * @author Alexis Eric, 
 * Erra Prod. http://www.erraprod.com
 * @copyright Copyright (c) 2012 - Erra Prod
 * @access public
 */
class ImportAction extends Erra_System_Action {

    /**
     * saveUser - Controlleur d'import du fichier excel des utilisateurs
     * @param type $file
     * @return type
     */
    public static function saveUser(Erra_Fields_Base_Object $field) {
        if (!strlen($field->xls_file->value)) {
            $field->xls_file->setError("Veuillez choisir un fichier pour l'miport");
        }
        if (!$field->bErrors()) {
            // Lire le fichier
            $file = DOCUMENT_ROOT . '/public/__files/' . $field->xls_file->value;
            $stack = self::getUserImportArrayFromFile($file);
            // On met le fichier en cache afin de ne pas avoir à le recalculer pour chaque requête ajax
            file_put_contents(DOCUMENT_ROOT . '/public/__files/' . $field->xls_file->value . '.cache', json_encode($stack));
            // Verification sommaire de l'intégrité du fichier 
            $import_file_enough_cols = (count($stack[0]) >= 8) ? true : false;
            $created_col_ok = (count($stack[0]) >= 8 && is_numeric($stack[0][6]) && !in_array('Prestation', $stack[0])) ? true : false;
            $num_records = count($stack);

            if ($num_records > 1 && $import_file_enough_cols && $created_col_ok) {
                $stack = array_reverse($stack);
                $jsCode = '<script type="text/javascript">';
                $jsCode .= 'enable_import("' . DOCUMENT_ROOT . '/public/__files/' . $field->xls_file->value . '", ' . count($stack) . ', "clients")';
                $jsCode .= '</script>';
                $field->setInfo("Le fichier est chargé sur le serveur" . $jsCode);
                return 'FORM_REFRESH_FIELD';
            }
        }
        $field->setWarning("Impossible d'importer ce fichier client !");
        return 'FORM_REFRESH_FIELD';
    }

    /**
     * saveRdv - Import du fichier excel des rendez-vous
     * @param Erra_Fields_Base_Object $field
     * @return string
     */
    public static function saveRdv(Erra_Fields_Base_Object $field) {
        if (!strlen($field->xls_file->value)) {
            $field->xls_file->setError("Veuillez choisir un fichier pour l'miport");
        }
        if (!$field->bErrors()) {
            // Lire le fichier
            $file = DOCUMENT_ROOT . '/public/__files/' . $field->xls_file->value;
            // On met le fichier en cache afin de ne pas avoir à le recalculer pour chaque requête ajax
            $stack = self::getRdvImportArrayFromFile($file);
            file_put_contents(DOCUMENT_ROOT . '/public/__files/' . $field->xls_file->value . '.cache', json_encode($stack));
            // Verification sommaire de l'intégrité du fichier
            $stack = array_reverse($stack);
            $inserted_rdv = 0;
            if (count($stack) > 1) {
                // On injecte du code javascript dans la réponse pour constuire le popup "voulez vous importer..."
                $jsCode = '<script type="text/javascript">';
                $jsCode .= 'enable_import("' . DOCUMENT_ROOT . '/public/__files/' . $field->xls_file->value . '", ' . count($stack) . ', "rdv")';
                $jsCode .= '</script>';
                $field->setInfo("Le fichier est chargé sur le serveur" . $jsCode);
                return 'FORM_REFRESH_FIELD';
            }
        }
        return 'FORM_REFRESH_FIELD';
    }

    /**
     * handleAgendas - Gestion de la création des agendas lors de l'import du fichier de rendez-vous
     * 
     * @param type $rdvInput
     * @return type
     */
    public static function handleAgendas($rdvInput) {
        $agendaNameIdAssoc = array();
        if (is_array($rdvInput) && count($rdvInput)) {
            $agendaList = array();
            foreach ($rdvInput as $input) {
                $agendaName = trim($input[6]);
                if ($input[0] != 3600) { // On s'assure que la ligne courante n'est pas le header du fichier .xls (conversion d'une chaine de caractère en nombre = 3600)
                    $agendaList[$agendaName] = array('nom_agenda' => $agendaName, 'object_class' => 'Msa_AgendaObject', 'object_id' => uniqid());
                    // Si le nom de l'agenda est congruent
                    if (!is_numeric($agendaName)) {
                        // On créé ou met à jour la prestation en fonction
                        $agendaExists = Erra_Core_DatabasePdo::SELECT('SELECT id FROM msa_agendaobject WHERE nom_agenda="' . $agendaName . '"');
                        if (Erra_Core_DatabasePdo::rowCount() && is_object($agendaExists)) {
                            $agendaExists = $agendaExists->fetch();
                            $agendaNameIdAssoc[$agendaName] = $agendaExists->id;
                        } else {
                            $column_names = array_keys($agendaList[$agendaName]);
                            $column_values = ajax_sanitize_input_for_db_insert(array_values($agendaList[$agendaName]));
                            $request = 'INSERT INTO msa_agendaobject(' . implode(', ', $column_names) . ') VALUES(' . implode(',', $column_values) . ')';
                            $result = Erra_Core_DatabasePdo::EXECUTE($request);
                            $lastId = Erra_Core_DatabasePdo::SELECT("SELECT id FROM msa_agendaobject ORDER BY id DESC LIMIT 1")->fetch();
                            $agendaNameIdAssoc[$agendaName] = $lastId->id;
                        }
                    }
                }
            }
        }
        return $agendaNameIdAssoc;
    }

    /**
     * handlePrestas - Gestion de la création des prestations lors de la créaton des rendez-vous
     * 
     * @param type $rdvInput
     * @return type
     */
    public static function handlePrestas($rdvInput) {
        $prestaNameIdAssoc = array();
        if (is_array($rdvInput) && count($rdvInput)) {
            $prestationList = array();
            foreach ($rdvInput as $input) {
                $prestationName = trim($input[7]);
                if ($input[0] != 3600) { // On s'assure que la ligne courante n'est pas le header du fichier .xls (conversion d'une chaine de caractère en nombre = 3600)
                    $duree = ($input[1] - $input[0]) / 60;
                    $prestationList[$prestationName] = array('prestation_name' => $prestationName, 'internet_name' => $prestationName, 'prestation_type_id' => 0, 'duree' => $duree, 'prix' => 1, 'object_class' => 'Msa_PrestationObject', 'object_id' => uniqid(), 'slot_color' => self::randomColor());
                    // Si le nom de la prestation est congruent
                    if (!is_numeric($prestationName)) {
                        // On créé ou met à jour la prestation en fonction
                        $prestaExists = Erra_Core_DatabasePdo::SELECT('SELECT id FROM msa_prestationobject WHERE prestation_name="' . $prestationName . '"');
                        if (Erra_Core_DatabasePdo::rowCount() && is_object($prestaExists)) {
                            $prestaExists = $prestaExists->fetch();
                            $prestaNameIdAssoc[$prestationName] = $prestaExists->id;
                        } else {
                            $column_names = array_keys($prestationList[$prestationName]);
                            $column_values = ajax_sanitize_input_for_db_insert(array_values($prestationList[$prestationName]));
                            $request = 'INSERT INTO msa_prestationobject(' . implode(', ', $column_names) . ') VALUES(' . implode(',', $column_values) . ')';
                            $result = Erra_Core_DatabasePdo::EXECUTE($request);
                            $lastId = Erra_Core_DatabasePdo::SELECT("SELECT id FROM msa_prestationobject ORDER BY id DESC LIMIT 1")->fetch();
                            $prestaNameIdAssoc[$prestationName] = $lastId->id;
                        }
                    }
                }
            }
        } 
        return $prestaNameIdAssoc;
    }

    /**
     * getUserImportArrayFromFile - Retourune un tableau associatif à partir du fichier d'import utilisateur de clicrdv
     * @param type $file
     * @return type
     */
    public static function getUserImportArrayFromFile($file) {
        $stack = array();
        if (file_exists($file)) {
            $xls = new Modules_Import_XlsxObject($file, false);
            // On parcourt les lignes, puis les colonnes pour construire notre tableau associatif
            for ($row = 1; $row <= $xls->rowcount(); $row++) {
                $rowExists = false;
                $currentRow = array();
                for ($col = 1; $col <= $xls->colcount(); $col++) {
                    if ($xls->val($row, $col) != null) {
                        // On sait que la colonne[2] = 'date de naissance' et colonne[6] = 'créé le'
                        // On convertit donc ces données en date
                        if ($col - 1 == 2 || $col - 1 == 6) {
                            $currentRow[$col - 1] = strtotime(str_replace('/', '-', $xls->val($row, $col))) + 3600; // +3600 car GMT+1
                        } else {
                            $currentRow[$col - 1] = self::toValue($xls->val($row, $col));
                        }
                        $rowExists = true;
                    }
                }
                // On ajoute cette ligne au tableau final seulement si il y a au moins une donnée
                if ($rowExists) {
                    $stack[] = $currentRow;
                }
            }
        }
        return $stack;
    }

    public static function getRdvImportArrayFromFile($file) {
        $stack = array();
        if (file_exists($file)) {
            $xls = new Modules_Import_XlsxObject($file, false);
            for ($row = 1; $row <= $xls->rowcount(); $row++) {
                $rowExists = false;
                $currentRow = array();
                // On parcourt les lignes, puis les colonnes pour construire notre tableau associatif
                for ($col = 1; $col <= $xls->colcount(); $col++) {
                    if ($xls->val($row, $col) != null) {
                        // On sait que la colonne[0] = 'heure de début', colonne[1] = heure de fin et colonne[4] = 'créé le'
                        // On convertit donc ces données en date
                        if ($col - 1 == 0 || $col - 1 == 1 || $col - 1 == 4) { // slot_start, slot_end, date_commade 
                            $currentRow[$col - 1] = strtotime(str_replace('/', '-', $xls->val($row, $col))) + 3600; // GMT+1
                        } else {
                            $currentRow[$col - 1] = self::toValue($xls->val($row, $col));
                        }
                        $rowExists = true;
                    }
                }
                // On ajoute cette ligne au tableau final seulement si il y a au moins une donnée
                if ($rowExists) {
                    $stack[] = $currentRow;
                }
            }
        }
        return $stack;
    }

    /**
     * randomColor() - Generates random color (eg: FF058E)
     * 
     * @return type
     */
    public static function randomColor() {
        $r = str_pad(dechex(mt_rand(0, 255)), 2, '0', STR_PAD_LEFT);
        $g = str_pad(dechex(mt_rand(0, 255)), 2, '0', STR_PAD_LEFT);
        $b = str_pad(dechex(mt_rand(0, 255)), 2, '0', STR_PAD_LEFT);
        return $r . $g . $b;
    }

    /**
     * toValue() - Converts excel cell data to value if possible
     * 
     * @param type $in
     * @return int
     */
    public static function toValue($in) {
        if ($in == 'non')
            return 0;
        if ($in == 'oui')
            return 1;
        return $in;
    }

}